iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
Software Development

我命由我不由語言 java爬蟲挑戰系列 第 23

java爬蟲挑戰 Day 23 - 完成重置及查看設定的指令

  • 分享至 

  • xImage
  •  

監聽器調整

DiscordBotListener

doBotCommand 方法中,我們需要增加處理新的指令 !info!reset!info 用來顯示使用者的訂閱資訊,而 !reset 則是重置用戶的所有設定,這樣用戶可以隨時重新設定推播條件。

case "!info":
    botResponeMessage = discordBotCommandService.showInfoCommand(userId);
    break;
case "!reset":
    botResponeMessage = discordBotCommandService.showInfoCommand(userId);
    break;

SubscribeUser 實體調整

SubscribeUser

為了讓使用者能夠透過 Discord 以嵌入訊息的形式看到訂閱狀態,我們新增了一個 toEmbed 方法。這個方法將使用者的訂閱資訊格式化為 Discord 的嵌入訊息格式。

// 將 SubscribeUser 物件的屬性轉換為 EmbedBuilder 物件,方便在 Discord 中顯示
public EmbedBuilder toEmbed() {
    EmbedBuilder embedBuilder = new EmbedBuilder();
    embedBuilder.setTitle("訂閱資訊");
    embedBuilder.setColor(0x00FF00); // 設定綠色的嵌入框架

    // 基本資訊避免ID洩漏,暫時不顯示用戶ID及頻道ID
    embedBuilder.addField("訂閱狀態", isSubscribe != null && isSubscribe ? "已訂閱" : "未訂閱", false);

    // 設定價格區間的顯示邏輯
    String priceRange = (lowestPrice != null ? lowestPrice : "無下限") + " ~ "
            + (highestPrice != null ? highestPrice : "無上限");
    embedBuilder.addField("價格區間", priceRange, false);

    // 設定樓層區間的顯示邏輯
    String floorRange = (lowestFloor != null ? lowestFloor : "無下限") + " ~ "
            + (highestFloor != null ? highestFloor : "無上限");
    embedBuilder.addField("樓層區間", floorRange, false);

    // 房型資訊的處理
    embedBuilder.addField("房型條件", rooms.isEmpty() ? "無指定" : String.join(", ", rooms), false);

    // 地址資訊的處理
    embedBuilder.addField("搜尋地區", address.isEmpty() ? "無指定" : String.join(", ", address), false);

    // 設備要求的處理
    embedBuilder.addField("設備要求", items.isEmpty() ? "無指定" : String.join(", ", items), false);

    return embedBuilder;
}

此方法將使用者的訂閱狀態、價格區間、樓層區間、房型條件、搜尋地區及設備要求,逐一轉換為 Discord 嵌入訊息的欄位,方便閱讀。

Service 邏輯實作

DiscordBotCommandServiceImpl

DiscordBotCommandServiceImpl 中,我們實作了兩個方法:showInfoCommandresetCommand

  • 顯示使用者訂閱資訊
    這段程式碼透過 showInfoCommand 方法來取得指定用戶的訂閱資訊,並將結果轉換為嵌入格式,方便在 Discord 中顯示。
@Override
public EmbedBuilder showInfoCommand(String userID) {
    // 從資料庫中找到對應的使用者訂閱資料
    SubscribeUser subscribeUser = subscribeUserRepository.findByUserId(userID);

    // 使用 toEmbed 方法將用戶資料轉換為 EmbedBuilder 格式
    return subscribeUser.toEmbed();
}
  • 重置使用者訂閱資訊
    resetCommand 方法會將用戶的所有訂閱設定清空,讓使用者能重新設定新的條件。
@Override
public EmbedBuilder resetCommand(String userID) {
    // 獲取用戶資料,若不存在則新建一個空的訂閱用戶
    SubscribeUser subscribeUser = getOrNewSubscribeUser(userID, "");

    // 訂閱狀態重置為未訂閱
    subscribeUser.setIsSubscribe(false);

    // 清空用戶的所有設定,包括房型、地址、設備、價格及樓層區間
    subscribeUser.getRooms().clear();
    subscribeUser.getAddress().clear();
    subscribeUser.getItems().clear();
    subscribeUser.setLowestPrice(null);
    subscribeUser.setHighestPrice(null);
    subscribeUser.setLowestFloor(null);
    subscribeUser.setHighestFloor(null);

    // 儲存變更至資料庫
    subscribeUserRepository.save(subscribeUser);

    // 返回重置成功的訊息
    return stringToEmbed("所有租屋條件已重置成功!");
}

這段程式碼的核心是清空用戶的所有設定,並將結果更新到資料庫中。最後返回一個嵌入訊息,通知使用者重置完成。

展示

  • 設定
    https://ithelp.ithome.com.tw/upload/images/20240909/20168635onNH11oQyD.png

https://ithelp.ithome.com.tw/upload/images/20240909/20168635dd3GcjuMpg.png

https://ithelp.ithome.com.tw/upload/images/20240909/20168635KTpd9kXOxo.png

  • 查看資訊
    https://ithelp.ithome.com.tw/upload/images/20240909/20168635gcdsqaGIRP.png
  • 重置後重新查看資訊
    https://ithelp.ithome.com.tw/upload/images/20240909/201686358Sx7z0bCJp.png

架構圖進度

今天的架構圖進度更新,雙向互動邏輯已完成。原先的設計認為只需要單向推播到 Discord,但事實上用戶需要能夠透過 Discord 來調整推播條件,因此調整成雙向互動。
https://ithelp.ithome.com.tw/upload/images/20240909/201686357Zxh6VCLle.png

而現在使用者已經可以透過Discord 來調整推播條件了,所已下列進度也完成了。
https://ithelp.ithome.com.tw/upload/images/20240909/20168635xBIKTFuBBz.png

Git 現狀

https://ithelp.ithome.com.tw/upload/images/20240909/20168635iB88kBP96k.png

小結

今天完成了重置及查看訂閱資訊的功能,明天開始開發推播往Discord左邊箭頭的部分。


上一篇
java爬蟲挑戰 Day 22 - 完成設定租屋條件的指令
下一篇
java爬蟲挑戰 Day 24 - 條件觸發時通知Discord Bot進行推播
系列文
我命由我不由語言 java爬蟲挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言